package org.zlb.algorithm.distance;

/**
 * 欧式距离 p = 2
 * d = sqrt((x1-x2)^+(y1-y2)^)
 * 三维的公式是 
 * d = sqrt(x1-x2)^+(y1-y2)^+(z1-z2)^)
 * 推广到n维空间，欧式距离的公式是 
 * d = sqrt( ∑(xi1-xi2)^ ) 这里i=1,2..n
 * 
 * 曼哈顿距离 p = 1
 * 切比雪夫距离 p = oo
 * 明可夫斯基距离
 * 
 * @author zhoulingbo
 * @date 2021/09/10
 */
public class Euclidean {
    
    /**
     * 点(x1,y1)到点(x2,y2)的欧式距离
     * @param x1
     * @param y1
     * @param x2
     * @param y2
     * @return
     */
    public static double d(double x1, double y1, double x2, double y2) {
        return Math.sqrt(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2));
    }
    
    /**
     * 向量v1、v2的欧式距离
     * @param v1
     * @param v2
     * @return
     */
    public static double d(double[] v1, double[] v2) {
        if (v1.length != v2.length)
            return -1;
        
        double sum = 0;
        for (int i=0; i<v1.length; i++) {
            sum += Math.pow(v1[i]-v2[i], 2);
        }
        return Math.sqrt(sum);
    }
}
